#pragma once
#include <json/json.h>
#include <string>

class JsonPacket
{
public:
	std::string Encode();
	int Decode(std::string& str);
	Json::Value& operator[](const std::string& key)
	{
		return _val[key];
	}
	Json::Value& operator[](const char* key)
	{
		return _val[key];
	}
	Json::Value* operator->()
	{
		return &_val;
	}

public:
	Json::Value             _val;
	Json::Reader            _reader;
};
template<class T>
inline T JsonTo(const Json::Value& json)
{
	T val;
	val << json;
	return val;
}

inline std::string& operator<<(std::string& val, const Json::Value& json)
{
	val = ((!json.isNull()) && json.isString()) ? json.asString() : "";
	return val;
}

inline int& operator<<(int& val, const Json::Value& json)
{
	val = ((!json.isNull()) && json.isInt()) ? json.asInt() : 0;
	return val;
}
inline double& operator<<(double& val, const Json::Value& json)
{
	val = ((!json.isNull()) && json.isDouble()) ? json.asDouble() : 0;
	return val;
}
inline float& operator<<(float& val, const Json::Value& json)
{
	val = ((!json.isNull()) && json.isDouble()) ? json.asFloat() : 0;
	return val;
}